package _11_Polymorphic;
/**
 * 隐藏的一个多态
 * 
 * 总结 :
 * 	通过子类,调用父类的方法的时候,父类的这个方法中的上下文环境就会发生
 * 多态(属于父类空间,子类对象)
 * 
 * @author lenovo
 * @Date 2020年7月10日
 * @Time 下午7:27:38
 */
public class Poly_04 {

	public static void main(String[] args) {
		SubClass sub = new SubClass();
		System.out.println(sub);// _11_Polymorphic.SubClass@15db9742
//		System.out.println(sub.i);//33
		sub.m1();
	}

}

class SupClass {
	int i = 10;
	int jkopfjjs = 2;

	public void m1() {
		/**
		 * this : 保存当前类对象的内存地址,并且是一个成员变量,那么 this 的数据类型是什么?
		 * 
		 * 当前类 : this 在哪个类体中,哪个就是当前类
		 * 
		 * 当 this 的数据类型是什么的时候,可以存储当前类对象的内存地址? 1.当前类类型 2.父类类型
		 * 
		 * 如果是父类类型,会发生多态,丢失子类特有的属性,经过测试,可以使用 this 调用当前类中的特有 的属性所以 this 的类型一定是当前类型
		 * 
		 * SupClass this ;
		 * 
		 * 谁调用这个方法, this 就指向谁
		 * 
		 * 这个 m1 方法是谁调用的? 如果是当前类对象调用的, this 就指向当前类对象 但是如果是子类对象调用的,this就指向子类对象
		 * 
		 * 结合起来就成了 SupClass this = new SubClass();发生多态
		 * 
		 */
//		System.out.println(this.jkopfjjs);
		System.out.println(this);
		System.out.println(this.i);

		// 调用不了
//		System.out.println(this.b);
		m2();
	}

	public void m2() {
		System.out.println("父类m2执行");
	}
}

class SubClass extends SupClass {
	int i = 33;
	int b = 2;

	public void m2() {
		System.out.println("子类 m2() 执行");
	}
}